在 Linux 系統中,應用程式可以依自己的特性把訊息傳送到系統中,並且指定到特定的類別 (Facility),每一個類別又可以分不同的嚴重性 (Severity)。
在 Linux 已經定義好的類別如下表所示:
Facility | 說明 |
---|---|
kern | 與內核相關的事件,例如驅動程式載入、硬體錯誤等。 |
user | 使用者層級的事件,例如使用者登入、登出等。 |
與郵件系統相關的事件,例如郵件傳輸、郵件伺服器錯誤等。 | |
daemon | 守護程式相關的事件,例如系統服務啟動、停止、錯誤等。 |
auth | 與驗證和授權相關的事件,例如使用者驗證、授權失敗等。 |
syslog | SYSLOG 守護程式自身的事件。 |
lpr | 列印系統相關的事件,例如列印工作提交、列印佇列狀態等。 |
news | 新聞伺服器相關的事件,例如新聞文章的發布、訂閱等。 |
uucp | UUCP(Unix-to-Unix Copy)相關的事件,用於遠端檔案傳輸和通訊。 |
cron | 與定時任務排程程式 cron 相關的事件。 |
authpriv | 與安全驗證和授權相關的私有事件,通常包含敏感資訊。 |
ftp | FTP 伺服器相關的事件,例如檔案上傳、下載等。 |
ntp | 網路時間協定(NTP)相關的事件,用於同步系統時鐘。 |
local0 - local7 | 這是一組自訂 Facility,可以根據需要進行自訂和使用。 |
然而,隨著時代的演進,有一些服務慢慢的不如以往流行,比如 ftp 或 news 之類的類別,但大扺上系統常用的類別不超過上列的項目,如果遇到不何使用的話,通常會放到 local0 ~ local7 的自訂類別中。
每一個類別記錄中,又可以分為不同層級,用來區分事件的嚴重性,有些是一般訊息,有些則是無傷大雅的流程資訊,但是一些比較嚴重的層級如 Warning、Error、Alert 或 Emergency 等訊息,系統管理員就要嚴陣以待,評估這些訊息是否為應用程式或系統上的問題並加以排解。
通用的層級表如下所示:
Level | Severity | Keyword | 說明 |
---|---|---|---|
0 | Emergency(緊急) | emerg | 表示系統遇到無法繼續運行的嚴重問題,需要立即採取行動。 |
1 | Alert(警示) | alert | 表示需要立即注意和回應的情況,但不需要立即中止系統。 |
2 | Critical(危急) | crit | 表示系統遭遇到重大問題,需要立即處理。 |
3 | Error(錯誤) | err | 表示系統發生了錯誤或失敗的情況,但仍然可以繼續運行。 |
4 | Warning(警告) | warning | 表示可能導致問題的情況或潛在的錯誤。 |
5 | Notice(通知) | notice | 表示一般的重要訊息,例如正常但值得注意的事件。 |
6 | Informational(資訊) | info | 表示一般的操作訊息或系統狀態更新。 |
7 | Debug(除錯) | debug | 表示用於除錯和故障排除的訊息。 |
以往我們要查看 syslog 時,必須依賴 rsyslog 這類的服務,在 systemd 中自帶有日誌功能,我們使用 journalctl
來查看這些系統日誌。
以下是一個用來比較 journalctl
(Systemd 日誌系統)和 rsyslog
(傳統的 Syslog 伺服器)差異的表格:
功能/特性 | journalctl(Systemd 日誌) | rsyslog |
---|---|---|
儲存位置 | 二進制檔案,通常在 /var/log/journal/ |
文本檔案,通常在 /var/log/ 目錄下 |
查看全局日誌 | journalctl |
cat /var/log/syslog 或 cat /var/log/messages |
過濾時間範圍 | journalctl --since 和 journalctl --until |
需使用 grep 、awk 等工具 |
日誌輪替 | 自動管理,透過設定自動輪替 | 通常由 logrotate 管理,需要手動設定 |
處理二進制日誌 | 原生支援 | 不支援 |
寫入遠端伺服器 | 需要額外配置或轉發到 rsyslog |
原生支援 |
查看即時日誌 | journalctl -f |
tail -f /var/log/[log file] |
系統啟動後日誌 | journalctl -b |
通常在 /var/log/boot.log 或相似檔案中查看 |
這個表格提供了 journalctl
和 rsyslog
之間基本的區別和特性比較。通常如果是單機或少量主機管理的話,使用 journalctl
足夠掌握系統訊息,但是主機數量一多,就需要搭配 rsyslog 的異地日誌主機來協助統一納管訊息。
我們可以根據環境的具體需求和習慣,選擇其中一個作為主要的日誌查看和管理工具。
在這毎部份裡,我們介紹如何使用 journalctl
查看系統資訊:
查看所有系統記錄
root# journalctl
查看 2023-06-11 之後的記錄
root# journalctl --since "2023-06-11"
查看標記為 class
的記錄
root# journalctl -t class
在 Enterprise Linux 中,journal 會把資料放在記憶體中,重開機後這些記錄會不見,若要將系統記錄資料持久化,可建立目錄 /var/log/journal/
就可以把所有資料儲存起來。
root# mkdir /var/log/journal/
rsyslog
和 systemd
的 journal
一樣會截取系統 SYSLOG
資訊,rsyslog
是系統的服務之一,會將收到的資訊寫到 /var/log/ 目錄裡的相關檔案,除非特別設定,否則大部份訊息都會存到 /var/log/messages
檔案中。
如果要把自訂訊息存到 syslog 中,可以使用 logger
指令完成,如下所示:
root# logger -t class -p user.info "Hello"
以下項目,將上述的做法分解說明:
logger
-t
class
-p
user
.info
"Hello"
參數 | 說明 |
---|---|
-t | 為這筆記錄貼上的標籤,如 class |
-p | 這筆記錄要記在一個系統訊息類別 (user ) 的等級 (info ) |
"Hello" | 這筆記錄的實際訊息 |
接著我們可以使用先前介紹的 journalctl 工具找出標籤為 class 的訊錄:
root# journalctl -t class
Log 是整個系統維運中重要的部份,它記載著系統運作的訊息,從開機、使用者行為、程式訊息到自訂的 Log 訊息都可以被收納起來。
在資訊安全應用中,當我們需要瞭解事件的軌跡時,在這種情境下也唯有 Log 才能夠讓管理員判別事件的前因後果,因此也應對 Log 進行妥善保管。